package com.xuzimian.globaldemo.spring.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

/**
 * @SessionAttribute 注解用在处理器类上，用于在多个请求之间传递参数，类是于Session的Attribute,但不完全一样。
 * @SessionAttribute设置的参数只用于暂时的传递，而不是长期的保存，像身份验证信息需要长期保存的参数还是应该使用
 * Session#Attribut 设置到Session中。
 *
 * @SessionAttribute 设置的参数有种用法：
 * 1.在视图中通过request.getAttribut 或 session.getAttribute 获取。
 * 2.在后面请求返回的视图中通过 session.getAttribute 或 Model获取。
 * 3.自动将参数设置到后面请求所对应处理器的Model类型参数 或者有 @ModelAttribute 注释的参数里面。
 *
 * 将参数设置到@SessionAttribute 需要两个条件：
 * 1.在@SessionAttribute注释中设置了参数的名字或者类型。
 * 2.在处理器中将参数设置到了Model中。
 *
 * ---------------------------------------------------------------------------------------------------------------------------------
 *
 * @SessionAttribute 的应用场景：
 * 1.企业业务系统中经常根据查询条件参数记录而结果分页显示的情况，这时候没翻一页都需要传递一次参数，如果将查询参数
 *   保存到SessionAttribute就无需再传递了。
 * 2.很多页面都有下拉列表，而且业务系统里这些列表的值很多时候都是可变的，是保存在数据库里的，使用时可以从数据库获取，
 *   如果将它们保存到SessionAttribute里会非常方便，就不需要没吃使用时都查询了。
 *
 *
 * @program: global-demo
 * @description: @SessionAttribute 注解
 * @author: xzm
 * @create: 2019-06-05 10:19
 **/
@Controller
@RequestMapping("/book")
@SessionAttributes(value={"book", "description"},types={Double.class})
public class SessionAttributeController {

    @RequestMapping("/index")
    public String index(Model model) throws Exception {
        model.addAttribute("book", "金刚经");
        model.addAttribute("description", "般若系列重要经典");
        model.addAttribute("price", new Double("999.99"));
        return "redirect:get";
    }
    @RequestMapping("/get")
    public String getBySessionAttributes(@ModelAttribute("book") String book, ModelMap model, SessionStatus sessionStatus) throws Exception {
        System.out.println("==========getBySessionAttributes============");
        System.out.println("get by @ModelAttribute:"+book);
        System.out.println("get by ModelMap:"+model.get("book")+"："+model.get("description")+"，"+model.get("price"));
        sessionStatus.setComplete();
        return "redirect:complete";
    }
    @RequestMapping("/complete")
    public String afterComplete(ModelMap model) throws Exception {
        System.out.println("==========afterComplete============");
        System.out.println(model.get("book")+"："+model.get("description")+"，"+model.get("price"));
        return "index";
    }
}
